package com.example.demo.common;


import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author lx
 * 验证码工具类
 */
public class CaptchaUtils extends CaptchaUtil {

    @Autowired
    private RedisUtil redisCacheManager;

    /**
     * 生成验证码，session(type=0),key为captcha/redis(type=1)key为system:captcha存储
     * @param request
     * @param response
     * @throws Exception
     */
    public Map<String,String> captcha(HttpServletRequest request, HttpServletResponse response,String type) throws Exception {
        Map<String,String> data=new HashMap<>();
        // 设置请求头为输出图片类型
        CaptchaUtil.setHeader(response);
        // 三个参数分别为宽、高、位数
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        // gif类型
        //GifCaptcha captcha = new GifCaptcha(130, 48);
        // 中文类型
        //ChineseCaptcha captcha = new ChineseCaptcha(130, 48);
        // 中文gif类型
        //ChineseGifCaptcha captcha = new ChineseGifCaptcha(130, 48);
        // 算术类型
        //ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
        //captcha.setLen(3);  // 几位数运算，默认是两位
        //captcha.getArithmeticString();  // 获取运算的公式：3+2=?
        //captcha.text();  // 获取运算的结果：5

        // 设置字体 非必填
        specCaptcha.setFont(new Font("Verdana", Font.PLAIN, 32));
        // 设置类型，纯数字、纯字母、字母数字混合
        // * TYPE_DEFAULT	数字和字母混合
        // * TYPE_ONLY_NUMBER	纯数字
        // * TYPE_ONLY_CHAR	纯字母
        // * TYPE_ONLY_UPPER	纯大写字母
        // * TYPE_ONLY_LOWER	纯小写字母
        // * TYPE_NUM_AND_UPPER	数字和大写字母

        specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
        if ("1".equals(type)){
            String uuid=UUID.randomUUID().toString();
            // 验证码存入redis
            redisCacheManager.hPut("system:captcha",uuid,specCaptcha.text().toLowerCase());
            data.put("key","system:captcha");
            data.put("uid",uuid);
            this.checkCaptchaByRedis(uuid,"");
        }else {
            // 验证码存入session
            request.getSession().setAttribute("captcha", specCaptcha.text().toLowerCase());
            data.put("key","captcha");
        }
        data.put("src",specCaptcha.toBase64());
        return data;
    }

    /**
     * 通过session获取验证码，判断验证码是否正确 0 不正确 1 正确
     * @param request
     * @param key session key
     * @param captcha captcha 验证码
     * @return
     * @throws Exception
     */
    public Map<String,String> checkCaptchBySession(HttpServletRequest request, String key, String captcha) throws Exception{
        Map<String,String> data=new HashMap<>();
        data.put("code","0");
        // 获取session中的验证码
        Object sessionCode = request.getSession().getAttribute(key);
        // 判断验证码
        if (sessionCode!=null&&sessionCode.equals(captcha.trim().toLowerCase())) {
            // 清除session中的验证码
            CaptchaUtil.clear(request);
            data.put("code","1");
        }
        return data;
    }

    /**
     * 通过redis获取验证码，判断验证码是否正确 0 不正确 1 正确
     * @param key
     * @param captcha
     * @return
     */
    public Map<String,String> checkCaptchaByRedis(String key, String captcha){
        Map<String,String> data=new HashMap<>();
        data.put("code","0");
        // 获取redis中的验证码
        Object redisCode = redisCacheManager.hGet("system:captcha",key);
        // 判断验证码
        if (redisCode!=null&&redisCode.equals(captcha.trim().toLowerCase())) {
            // 清除redis中的验证码
            redisCacheManager.hDelete("system:captcha",key);
            data.put("code","1");
        }
        return data;
    }
}
